首先定义正态分布函数和标准欧式看涨期权定价函数
正态分布的数值定价方法可见:
https://bbs.pinggu.org/thread-3636277-1-1.html
- ///////////////////////////////////////////////////////////////////////
- // 先定义标准正态分布的全局函数
- // 误差函数的近似公式
- double erf(double a)
- {
- double a1=0.0705230784,
- a2=0.0422820123,
- a3=0.0092705272,
- a4=0.0001520143,
- a5=0.0002765672,
- a6=0.0000430638;
- a=1+a1*a+a2*a*a+a3*a*a*a+a4*a*a*a*a+a5*a*a*a*a*a+a6*a*a*a*a*a*a;
- a=pow(a,16);
- a=1-1/a;
- return(a);
- }
- // 正态分布的累积分布函数
- inline double NormCDF(double x)
- {
- double result;
- if(x>=0)
- {
- result=0.5+0.5*erf(x/sqrt(2));
- } else if(x<0)
- {
- result=0.5-0.5*erf(fabs(x/sqrt(2)));
- }
- return(result);
- }
- // 定义欧式看涨期权定价
- inline double CallOptionPricing(double s,double k,double sigma,double time,double rate)
- {
- double omiga,EuropeCallOptionPricing;
- omiga=rate*time+sigma*sigma*time/2-log(k/s);
- omiga=omiga/(sigma*sqrt(time));
- EuropeCallOptionPricing=s*NormCDF(omiga)-k*exp(-rate*time)*NormCDF(omiga-sigma*sqrt(time));
- return(EuropeCallOptionPricing);
- }
定义欧式看涨期权和欧式看涨幂期权的类:
- // 以上定义了标准正态分布的累积分布函数的数值计算
- // 以下定义标准的欧式看涨期权
- class EurOptionPricing
- {
- protected:
- double S;
- double K;
- double Sigma;
- double Time;
- double Rate;
- public:
- EurOptionPricing(double s,double k,double si,double ti,double r):
- S(s),K(k),Sigma(si),Time(ti),Rate(r){}
- ~EurOptionPricing(){}
- virtual double OptionPricing()
- {
- return(CallOptionPricing(S,K,Sigma,Time,Rate));
- }
- };
- // 定义非线性支付的幂期权
- class PowerOptionPricing:public EurOptionPricing
- {
- protected:
- double Alpha;
- public:
- PowerOptionPricing(double s,double k,double si,double ti,double r,double a):
- EurOptionPricing(s,k,si,ti,r),Alpha(a){}
- ~PowerOptionPricing(){}
- virtual double OptionPricing()
- {
- double RateAlpha;
- double SAlpha;
- double SigmaAlpha;
- double PowOptionPricing;
- RateAlpha=Alpha*(Rate-pow(Sigma,2)/2)+pow(Sigma*Alpha,2)/2;
- SAlpha=pow(S,Alpha);
- SigmaAlpha=Alpha*Sigma;
- // 定义乘数
- double ExpS=exp((Alpha-1)*Time*(Rate+Alpha*pow(Sigma,2)/2));
- PowOptionPricing=ExpS*CallOptionPricing(SAlpha,K,SigmaAlpha,Time,RateAlpha);
- return(PowOptionPricing);
- }
- };
- // 以上定义了欧式看涨幂期权的类
- ///////////////////////////////////////////////////////////////////////
以下定义基于常方差弹性期权定价模型,由于常方差弹性期权定价模型需要利用到非中心化的卡方累积分布函数,则常方差弹性期权定价模型和非中心化的卡方累积分布函数资料如下:
本帖隐藏的内容
非中心化的卡方分布函数的数值定义和CEV期权类如下
- // 以下定义常方差弹性期权定价模型
- // 首先须定义非中心化的卡方累积分布函数
- // 非中心化的卡方分布函数的数值定义如下
- double NonCenterCDF(double x,double NonCenterParamters,double DegreeFreedom)
- {
- // NonCenterParamters是非中心化参数
- // DegreeFreedom是自由度
- double h;
- double p;
- double m;
- double k;
- double lemda;
- double mains1,mains2;
- k=DegreeFreedom;
- lemda=NonCenterParamters;
- h=1-2/3*(k+lemda)*(k+3*lemda)/pow(k+2*lemda,2);
- p=(k+2*lemda)/pow(k+lemda,2);
- m=(h-1)*(1-3*h);
- mains2=h*sqrt(2*p)*(1+0.5*m*p);
- mains1=pow(x/(k+lemda),h)-(1+h*p*(h-1-m*p*(2-h)/2));
- return(NormCDF(mains1/mains2));
- }
- ///////////////////////////////////////////////////////////////////////
- // 定义好了非中心化的卡方分布累积密度函数定义,接着定义常方差弹性期权定价模型的类
- class CEVOptionPricing
- {
- private:
- double K;
- double S;
- double Dividend; // 红利的定义
- double Time;
- double Alpha; // 常方差弹性系数
- double Rate;
- double Sigma;
- public:
- CEVOptionPricing(double k,double s,double div,double time,
- double al,double ra,double sig):K(k),S(s),Dividend(div),Time(time),
- Alpha(al),Rate(ra),Sigma(sig){}
- ~CEVOptionPricing(){}
- double CallOptionPricing()
- {
- double a,b,c,v;
- double CallCEVOptionPricing;
- v=Sigma*Sigma/(2*(Alpha-1)*(Rate-Dividend))*(exp(2*Time*(Alpha-1)*(Rate-Dividend))-1);
- a=pow(K*exp((Dividend-Rate)*Time),2*(1-Alpha))/pow(1-Alpha,2)/v;
- b=1/(1-Alpha);
- c=pow(S,2*(1-Alpha))/v/pow(1-Alpha,2);
- if (Alpha<1 && Alpha>0)
- {
- CallCEVOptionPricing=S*exp(-Time*Dividend)*(1-NonCenterCDF(a,b+2,c))-
- K*exp(-Time*Rate)*NonCenterCDF(c,b,a);
- } else if (Alpha>=1)
- {
- CallCEVOptionPricing=S*exp(-Time*Dividend)*(1-NonCenterCDF(c,-b,a))-
- K*exp(-Time*Rate)*NonCenterCDF(a,2-b,c);
- }
- return(CallCEVOptionPricing);
- }
- double PutOptionPricing()
- {
- double PutCEVOptionPricing;
- double a,b,c,v;
- v=Sigma*Sigma/(2*(Alpha-1)*(Rate-Dividend))*(exp(2*Time*(Alpha-1)*(Rate-Dividend))-1);
- a=pow(K*exp((Dividend-Rate)*Time),2*(1-Alpha))/pow(1-Alpha,2)/v;
- b=1/(1-Alpha);
- c=pow(S,2*(1-Alpha))/v/pow(1-Alpha,2);
- if (Alpha<1 && Alpha>0)
- {
- PutCEVOptionPricing=K*exp(-Time*Rate)*(1-NonCenterCDF(c,b,a))-
- S*exp(-Time*Dividend)*NonCenterCDF(a,b+2,c);
- } else if (Alpha>=1)
- {
- PutCEVOptionPricing=K*exp(-Time*Rate)*(1-NonCenterCDF(a,2-b,c))-
- S*exp(-Time*Dividend)*NonCenterCDF(c,-b,a);
- }
- return(PutCEVOptionPricing);
- }
- };
- int main()
- {
- // 非线性支付期权的参数设定
- double Sn=10,Kn=13,Tn=100,Sigman=0.03,Raten=0.03/360,Alphan=1.1;
- PowerOptionPricing PowOption(Sn,Kn,Sigman,Tn,Raten,Alphan);
- cout<<"欧式看涨幂期权定价为:"<<PowOption.OptionPricing()<<endl;
- // 定义CEV期权定价的参数
- double S=10,K=13,T=100,Sigma=0.03,Rate=0.03/100,Alpha=0.9,Div=0;
- CEVOptionPricing CEVOption(K,S,Div,T,Alpha,Rate,Sigma);
- cout<<"常方差弹性模型的看涨期权定价:"<<CEVOption.CallOptionPricing()<<endl;
- cout<<"常方差弹性模型的看跌期权定价:"<<CEVOption.PutOptionPricing()<<endl;
- return 0;
- }
结果(VS2012):
全部代码: